## Linux User Creator: Automatic and Simple (LUCAS.py)
## Lucas S. Beiler ~ 22/08/2019 ~ 2⁰ semestre de Ciência da Computação

import urllib.request, time, subprocess, sys

# Dependências: python3 e (opcionalmente) openssl

print("[!] Olá, este script serve para criar usuários em sistemas Linux através de um arquivo de texto contendo nomes e senhas.")
print("\n[!] A seguir, você deverá informar um arquivo onde cada usuário ocupe uma linha com a seguinte sintaxe: 'nome:senha'")
print("\n[!] AVISO: Permissão root é necessária para que o script execute o comando useradd.\n")

localArquivo = str(input("\n[*] Digite o caminho para o arquivo de usuários e senhas (para baixá-lo do servidor principal, deixe em branco): "))

if localArquivo:
    criptografado = str(input("[*] As senhas no arquivo estão criptografadas de forma aceita pelo useradd --password? (s/N): "))
    tipoLocalArquivo = str(input("[*] Devo tratar o caminho para o arquivo digitado acima como URL (fonte remota) ou arquivo (fonte local)? (remota/local): "))

if not localArquivo: # Condição exclusiva para o download da lista a partir do meu site
    localArquivo = 'http://aulapython-criarusuario.dx.am/lista.txt'
    tipoLocalArquivo = 'remoto'
    criptografado = 's'

if 'R' in tipoLocalArquivo.upper() or not localArquivo: # Se o input contém a letra 'r', só pode ser da opção REMOTO, "local" não contém 'r'.
    print("[!] Considerando arquivo de lista como arquivo remoto.")
    nomeArquivoDownload = str(input("[*] Com qual nome deseja salvar o arquivo a ser baixado? "))
    urllib.request.urlretrieve(localArquivo, nomeArquivoDownload)
    localArquivo = nomeArquivoDownload
elif 'L' in tipoLocalArquivo.upper(): # Se o input contém a letra 'l', só pode ser da opção LOCAL, "remoto" não contém 'l'.
    print("[!] Considerando arquivo de lista como arquivo local.")
else:
    print("Erro. Verifique a resposta.")

arquivo = open(localArquivo, "r")

tempoInicial = time.time()

for linha in arquivo:
    usuario = linha.rsplit(":")[0]
    caracteresProibidos = [' ', '\\', '/', ';', '|', '&', '$', '-', '=', '>', '<', '{', '}', '[', ']', '?', '#', '!', '@', '%', '+', '*']
    for caracterProibido in caracteresProibidos:
        if caracterProibido in usuario or usuario[0].isdigit() or linha.count(':') > 1:
            print("[!] Erro. Algo impróprio detectado ('{}') no username '{}'!".format(caracterProibido, usuario))
            sys.exit()
    senha = linha.rsplit(":")[1]
    print("[+] Criando {}...".format(usuario))
    if 'n'.upper() in criptografado.upper() or not criptografado:
        subprocess.run("useradd {} -m -g users -p $(openssl passwd -6 {})".format(usuario, senha), shell=True)
    elif 's'.upper() in criptografado.upper():
        subprocess.run("useradd {} -m -g users -p {}".format(usuario, senha), shell=True)

print("\n\n[+] Execução finalizada em {}ms!\n".format(int(round((time.time() - tempoInicial)*1000))))
